home *** CD-ROM | disk | FTP | other *** search
- ; Unconditional Jumps
-
- .386
- option segment:use16
-
- dseg segment para public 'data'
-
-
- ; Pointers to statements in the code segment
-
- IndPtr1 word IndTarget2
- IndPtr2 dword IndTarget3
-
-
-
- dseg ends
-
-
- cseg segment para public 'code'
- assume cs:cseg, ds:dseg
-
- Main proc
- mov ax, dseg
- mov ds, ax
- mov es, ax
-
- ; JMP instructions transfer control to the
- ; location specified in the operand field.
- ; This is typically a label that appears
- ; in the program.
- ;
- ; There are many variants of the JMP
- ; instruction. The first is a two-byte
- ; opcode that transfers control to +/-128
- ; bytes around the current instruction:
-
- jmp CloseLoc
- nop
- CloseLoc:
-
-
- ; The next form is a three-byte instruction
- ; that allows you to jump anywhere within
- ; the current code segment. Normally, the
- ; assembler would pick the shortest version
- ; of a given JMP instruction, the "near ptr"
- ; operand on the following instruction
- ; forces a near (three byte) JMP:
-
-
- jmp near ptr NearLoc
- nop
- NearLoc:
-
-
- ; The third form to consider is a five-byte
- ; instruction that provides a full segmented
- ; address operand. This form of the JMP
- ; instruction lets you transfer control any-
- ; where in the program, even to another
- ; segment. The "far ptr" operand forces
- ; this form of the JMP instruction:
-
- jmp far ptr FarLoc
- nop
- FarLoc:
-
-
- ; You can also load the target address of a
- ; near JMP into a register and jump indirectly
- ; to the target location. Note that you can
- ; use any 80x86 general purpose register to
- ; hold this address; you are not limited to
- ; the BX, SI, DI, or BP registers.
-
- lea dx, IndTarget
- jmp dx
- nop
- IndTarget:
-
-
- ; You can even jump indirect through a memory
- ; variable. That is, you can jump though a
- ; pointer variable directly without having to
- ; first load the pointer variable into a reg-
- ; ister (Chapter Six describes why the following
- ; labels need two colons).
-
- jmp IndPtr1
- nop
- IndTarget2::
-
-
- ; You can even execute a far jump indirect
- ; through memory. Just specify a dword
- ; variable in the operand field of a JMP
- ; instruction:
-
- jmp IndPtr2
- nop
- IndTarget3::
-
-
-
- Quit: mov ah, 4ch
- int 21h
- Main endp
-
- cseg ends
-
- sseg segment para stack 'stack'
- stk byte 1024 dup ("stack ")
- sseg ends
-
- zzzzzzseg segment para public 'zzzzzz'
- LastBytes byte 16 dup (?)
- zzzzzzseg ends
- end Main
-